Writing a Time Client 写个时间客户端

    在 Netty 中,编写服务端和客户端最大的并且唯一不同的使用了不同的BootStrap 和 的实现。请看一下下面的代码:

    1.BootStrap 和 ServerBootstrap 类似,不过他是对非服务端的 channel 而言,比如客户端或者无连接传输模式的 channel。

    3.代替的是NioSocketChannel,这个类在客户端channel 被创建时使用。

    4.不像在使用 ServerBootstrap 时需要用 childOption() 方法,因为客户端的 没有父亲。

    正如你看到的,他和服务端的代码是不一样的。ChannelHandler 是如何实现的?他应该从服务端接受一个32位的整数消息,把他翻译成人们能读懂的格式,并打印翻译好的时间,最后关闭连接:

    1. public class TimeClientHandler extends ChannelInboundHandlerAdapter {
    2. @Override
    3. public void channelRead(ChannelHandlerContext ctx, Object msg) {
    4. ByteBuf m = (ByteBuf) msg; // (1)
    5. System.out.println(new Date(currentTimeMillis));
    6. ctx.close();
    7. } finally {
    8. m.release();
    9. }
    10. @Override
    11. public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
    12. cause.printStackTrace();
    13. ctx.close();
    14. }

    1.在TCP/IP中,Netty 会把读到的数据放到 ByteBuf 的数据结构中。

    这样看起来非常简单,并且和服务端的那个例子的代码也相差不多。然而,处理器有时候会因为抛出 IndexOutOfBoundsException 而拒绝工作。在下个部分我们会讨论为什么会发生这种情况。